/*
  Programa GEFE - Gestión de eventos lúdicos.
  Copyright (C) 2010  Antonio Ramírez Marti

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "acolitohabitaciones.h"
#include "ui_acolitohabitaciones.h"

AcolitoHabitaciones::AcolitoHabitaciones(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::AcolitoHabitaciones)
{
    ui->setupUi(this);
    setup();
}

AcolitoHabitaciones::~AcolitoHabitaciones()
{
    delete ui;
    if(modelo)
        delete modelo;
    if(mapper)
        delete mapper;
}

void AcolitoHabitaciones::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

bool AcolitoHabitaciones::isConectado() const
{
    return flagConexion;
}

void AcolitoHabitaciones::setConectado(bool estado)
{
    switch(estado)
    {
    case 1:     //Conectar
        this->destruyeModelos();
        this->creaModelos();
        this->conectaModelos();
        this->preparaInterfaz();
        break;
    case 0:     //Desconectar
        this->destruyeModelos();
        break;
    }

    flagConexion=estado;
}

void AcolitoHabitaciones::setup()
{
    modelo=0;
    mapper=0;
    modeloGrupos=0;
    filtroGrupos=0;
    codigoFiltrado=QString();
}

void AcolitoHabitaciones::creaModelos()
{
    if(!modelo)
        modelo=new ModeloHabitaciones(this,QSqlDatabase::database("evento"));

    if(!mapper)
        mapper=new QDataWidgetMapper(this);

    if(!modeloGrupos)
        modeloGrupos=new QSqlQueryModel(this);

    if(!filtroGrupos)
        filtroGrupos=new QSortFilterProxyModel(this);
}

void AcolitoHabitaciones::conectaModelos()
{
    modelo->select();
    modelo->setEditStrategy(QSqlTableModel::OnFieldChange);

    mapper->setModel(modelo);
    mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);

    modeloGrupos->setQuery("select idasis,nombre,apellido,dni,email,codHab "
                           "from asistente,asignado_a "
                           "where asistente.idgrupo=asignado_a.idgrupo",QSqlDatabase::database("evento"));

    filtroGrupos->setSourceModel(modeloGrupos);
    filtroGrupos->setFilterKeyColumn(5);

    // Conecta el mapper con la interfaz
    mapper->addMapping(ui->codigoEdit,ModeloHabitaciones::CodigoHab);
    mapper->addMapping(ui->localizacionEdit,ModeloHabitaciones::Localizacion);
    mapper->addMapping(ui->totalPlazaSpinBox,ModeloHabitaciones::MaxPlazas);
    mapper->addMapping(ui->librePlazaSpinBox,ModeloHabitaciones::PlazasLibres);
    mapper->addMapping(ui->reservadaEdit,ModeloHabitaciones::Reservada,"estado");
    mapper->addMapping(ui->asignadaCheckBox,ModeloHabitaciones::Asignada,"estado");
    mapper->addMapping(ui->ocupadaCheckBox,ModeloHabitaciones::Ocupada,"estado");
    mapper->addMapping(this,ModeloHabitaciones::CodigoHab,"filtrado");

    mapper->toFirst();
}

void AcolitoHabitaciones::destruyeModelos()
{
    if(modelo)
    {
        delete modelo;
        modelo=0;
    }
    if(mapper)
    {
        delete mapper;
        mapper=0;
    }

    if(modeloGrupos)
    {
        delete modeloGrupos;
        modeloGrupos=0;
    }

    if(filtroGrupos)
    {
        delete filtroGrupos;
        filtroGrupos=0;
    }
}

void AcolitoHabitaciones::preparaInterfaz()
{
    ui->habitacionView->setModel(modelo);
    ui->habitacionView->setModelColumn(ModeloHabitaciones::CodigoHab);

    //Sincroniza el mapper con la vista
    connect(ui->habitacionView->selectionModel(),SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),mapper,SLOT(setCurrentModelIndex(QModelIndex)));

    //Asocia la vista de grupos con su modelo
    ui->grupoView->setModel(filtroGrupos);
    ui->grupoView->setColumnHidden(0,true);
}

QString AcolitoHabitaciones::getFiltro() const
{
    return this->codigoFiltrado;
}

void AcolitoHabitaciones::setFiltro(QString filtro)
{
    codigoFiltrado=filtro;
    this->filtroGrupos->setFilterRegExp(filtro);
}

void AcolitoHabitaciones::reloadModelos()
{
    if(isConectado())
    {
        modelo->select();
        modeloGrupos->setQuery("select idasis,nombre,apellido,dni,email,codHab "
                               "from asistente,asignado_a "
                               "where asistente.idgrupo=asignado_a.idgrupo",QSqlDatabase::database("evento"));

    }
}
